package org.azmat.demoredis.Redis.RedisTemplate;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
public class RedisOpsForList {

    @Autowired
    RedisTemplate redisTemplate;

    @Test
    /**
     * ● Long leftPush(K k,V v)：从左侧将一个元素添加到列表。
     * ● Long leftPushAll(K k,V ... vs)：从左侧一次将多个元素添加到列表。
     * ● Long size(K k)：获取集合中的元素个数。
     * ● List<V> range(K k,long l, long l1)：返回某个列表指定索引区间的元素。索引从0算起，-1表示最右侧的第一个元素。
     */
    void testList1() {
        // 使用leftPush方法向列表中添加元素
        redisTemplate.opsForList().leftPush("list", "a");
        redisTemplate.opsForList().leftPush("list", "b");
        redisTemplate.opsForList().leftPush("list", "c");
        // 输出列表
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
        // 获取元素的数量
        System.out.println(redisTemplate.opsForList().size("list"));
        // 一次添加多个元素
        redisTemplate.opsForList().leftPushAll("list", "d", "e", "f");
        String[] str = {"3", "4", "5"};
        redisTemplate.opsForList().leftPushAll("list", str);
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
        // 获取元素的数量
        System.out.println(redisTemplate.opsForList().size("list"));
    }

    @Test
    void testList2() {
        /**
         * rightPush(K k,V v)：从右侧将一个元素添加到列表。
         * rightPushAll(K k,V ... vs)：从右侧一次将多个元素添加到列表。
         */
        redisTemplate.opsForList().rightPush("list1", "g");
        redisTemplate.opsForList().rightPush("list1", "h");
        // 输出列表
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
        // 获取元素的数量
        System.out.println(redisTemplate.opsForList().size("list1"));
        // 一次添加多个元素
        redisTemplate.opsForList().rightPushAll("list1", "i", "j", "k");
        String[] str = {"6", "7", "8"};
        redisTemplate.opsForList().rightPushAll("list1", str);
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
        // 获取元素的数量
        System.out.println(redisTemplate.opsForList().size("list1"));
    }

    @Test
    void testList3() {
        /**
         * Long remove(K k,long l,V v)：从列表中删除指定个数的元素。
         */
        // 输出List列表
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
        // 删除列表中的元素
        redisTemplate.opsForList().remove("list1", 1, "i");   // key: list1, conut: 删除个数 ，value: 删除的元素
        // 输出List列表
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
        // 从左侧删除元素
        redisTemplate.opsForList().remove("list1", 1, "g");   // key: list1, conut: 删除个数 ，value: 删除的元素
        // 从右侧删除元素
        redisTemplate.opsForList().remove("list1", -1, "k");   // key: list1, conut: 删除个数 ，value: 删除的元素
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
        // 删除全部元素
        redisTemplate.opsForList().remove("list1", 0, "i");  // key: list1, conut: 删除个数 ，value: 删除的元素
        System.out.println(redisTemplate.opsForList().range("list1", 0, -1));
    }

    @Test
    void testList4() {
        /**
         * leftPop(K k)：删除并返回左侧的第一个元素。
         * rightPop(K k)：删除并返回右侧的第一个元素。
         */
        // 输出List列表
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
        redisTemplate.opsForList().leftPop("list");
        // 输出列表
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));

        redisTemplate.opsForList().rightPop("list");
        // 输出列表
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
    }

    @Test
    void testList5() {
        /**
         * index(K k,long l)：获取指定索引处的元素值。
         * set(K k,long l,V v)：为指定索引初的元素设置值，原有值将被覆盖。
         */
        // 输出列表
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
        // 获取指定索引处的元素值
        System.out.println(redisTemplate.opsForList().index("list", 2));
        // 为指定索引处的元素设置值
        redisTemplate.opsForList().set("list", 2, "n");
        // 输出列表
        System.out.println(redisTemplate.opsForList().range("list", 0, -1));
    }
}
